В больших приложениях поток логов может быть огромным — это перегружает хранилище и снижает производительность.
Полное отключение детальных логов — плохое решение, ведь важные данные могут потеряться. Лучше использовать выборочное логирование.
.NET теперь поддерживает несколько стратегий выборочного логирования:
• Случайная выборка по вероятности
• Выборка по трассировке
• Пользовательские сэмплеры для гибкой настройки
Пример простого пользовательского сэмплера для .NET, который ограничивает вывод логов до примерно 1 сообщения в секунду:
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { var key = eventId.Id.ToString();
var now = DateTime.UtcNow;
var lastTime = _lastLoggedTimes.GetOrAdd(key, DateTime.MinValue);
if ((now - lastTime) >= _interval) { _lastLoggedTimes[key] = now;
var message = formatter(state, exception); Console.WriteLine($"[{now:O}] {logLevel}: {message}"); // Здесь вместо Console.WriteLine — вызов реального логгера } else { // Пропускаем лог, чтобы не создавать слишком много записей } }
Это может снизить затраты на хранение и обработку логов без потери ключевой информации.
В больших приложениях поток логов может быть огромным — это перегружает хранилище и снижает производительность.
Полное отключение детальных логов — плохое решение, ведь важные данные могут потеряться. Лучше использовать выборочное логирование.
.NET теперь поддерживает несколько стратегий выборочного логирования:
• Случайная выборка по вероятности
• Выборка по трассировке
• Пользовательские сэмплеры для гибкой настройки
Пример простого пользовательского сэмплера для .NET, который ограничивает вывод логов до примерно 1 сообщения в секунду:
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) { var key = eventId.Id.ToString();
var now = DateTime.UtcNow;
var lastTime = _lastLoggedTimes.GetOrAdd(key, DateTime.MinValue);
if ((now - lastTime) >= _interval) { _lastLoggedTimes[key] = now;
var message = formatter(state, exception); Console.WriteLine($"[{now:O}] {logLevel}: {message}"); // Здесь вместо Console.WriteLine — вызов реального логгера } else { // Пропускаем лог, чтобы не создавать слишком много записей } }
Это может снизить затраты на хранение и обработку логов без потери ключевой информации.
Pinterest (PINS) closed at $71.75 in the latest trading session, marking a -0.18% move from the prior day. This change lagged the S&P 500's daily gain of 0.1%. Meanwhile, the Dow gained 0.9%, and the Nasdaq, a tech-heavy index, lost 0.59%.
Heading into today, shares of the digital pinboard and shopping tool company had lost 17.41% over the past month, lagging the Computer and Technology sector's loss of 5.38% and the S&P 500's gain of 0.71% in that time.
Investors will be hoping for strength from PINS as it approaches its next earnings release. The company is expected to report EPS of $0.07, up 170% from the prior-year quarter. Our most recent consensus estimate is calling for quarterly revenue of $467.87 million, up 72.05% from the year-ago period.
The S&P 500 slumped 1.8% on Monday and Tuesday, thanks to China Evergrande, the Chinese property company that looks like it is ready to default on its more-than $300 billion in debt. Cries of the next Lehman Brothers—or maybe the next Silverado?—echoed through the canyons of Wall Street as investors prepared for the worst.